home *** CD-ROM | disk | FTP | other *** search
/ Clickx 115 / Clickx 115.iso / software / tools / windows / tails-i386-0.16.iso / live / filesystem.squashfs / usr / share / system-config-printer / userdefault.py < prev    next >
Encoding:
Python Source  |  2010-09-28  |  6.0 KB  |  173 lines

  1. #!/usr/bin/env python
  2.  
  3. ## Copyright (C) 2006, 2007, 2008, 2010 Red Hat, Inc.
  4. ## Author: Tim Waugh <twaugh@redhat.com>
  5.  
  6. ## This program is free software; you can redistribute it and/or modify
  7. ## it under the terms of the GNU General Public License as published by
  8. ## the Free Software Foundation; either version 2 of the License, or
  9. ## (at your option) any later version.
  10.  
  11. ## This program is distributed in the hope that it will be useful,
  12. ## but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ## GNU General Public License for more details.
  15.  
  16. ## You should have received a copy of the GNU General Public License
  17. ## along with this program; if not, write to the Free Software
  18. ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20. import gtk
  21. import os
  22. import subprocess
  23.  
  24. class UserDefaultPrinter:
  25.     def __init__ (self):
  26.         try:
  27.             lpoptions = os.environ["HOME"]
  28.         except KeyError:
  29.             try:
  30.                 lpoptions = "/home/" + os.environ["USER"]
  31.             except KeyError:
  32.                 lpoptions = None
  33.  
  34.         if lpoptions:
  35.             lpoptions += "/.cups/lpoptions"
  36.  
  37.         self.lpoptions = lpoptions
  38.  
  39.     def clear (self):
  40.         if not self.lpoptions:
  41.             return
  42.  
  43.         try:
  44.             opts = file (self.lpoptions).readlines ()
  45.         except IOError:
  46.             return
  47.  
  48.         for i in range (len (opts)):
  49.             if opts[i].startswith ("Default "):
  50.                 opts[i] = "Dest " + opts[i][8:]
  51.         file (self.lpoptions, "w").writelines (opts)
  52.  
  53.     def get (self):
  54.         if not self.lpoptions:
  55.             return None
  56.  
  57.         try:
  58.             opts = file (self.lpoptions).readlines ()
  59.         except IOError:
  60.             return None
  61.  
  62.         for i in range (len (opts)):
  63.             if opts[i].startswith ("Default "):
  64.                 rest = opts[i][8:]
  65.                 slash = rest.find ("/")
  66.                 if slash != -1:
  67.                     space = rest[:slash].find (" ")
  68.                 else:
  69.                     space = rest.find (" ")
  70.                 return rest[:space]
  71.         return None
  72.  
  73.     def set (self, default):
  74.         p = subprocess.Popen ([ "lpoptions", "-d", default ],
  75.                               close_fds=True,
  76.                               stdin=file ("/dev/null"),
  77.                               stdout=file ("/dev/null", "w"),
  78.                               stderr=subprocess.PIPE)
  79.         (stdout, stderr) = p.communicate ()
  80.         exitcode = p.wait ()
  81.         if exitcode != 0:
  82.             raise RuntimeError (exitcode, stderr.strip ())
  83.         return
  84.  
  85.     def __repr__ (self):
  86.         return "<UserDefaultPrinter (%s)>" % repr (self.get ())
  87.  
  88. class UserDefaultPrompt:
  89.     def __init__ (self,
  90.                   set_default_fn,
  91.                   refresh_fn,
  92.                   name,
  93.                   title,
  94.                   parent,
  95.                   primarylabel,
  96.                   systemwidelabel,
  97.                   clearpersonallabel,
  98.                   personallabel):
  99.         self.set_default_fn = set_default_fn
  100.         self.refresh_fn = refresh_fn
  101.         self.name = name
  102.         dialog = gtk.Dialog (title,
  103.                              parent,
  104.                              gtk.DIALOG_MODAL |
  105.                              gtk.DIALOG_DESTROY_WITH_PARENT |
  106.                              gtk.DIALOG_NO_SEPARATOR,
  107.                              (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
  108.                               gtk.STOCK_OK, gtk.RESPONSE_OK))
  109.         dialog.set_default_response (gtk.RESPONSE_OK)
  110.         dialog.set_border_width (6)
  111.         dialog.set_resizable (False)
  112.         hbox = gtk.HBox (False, 12)
  113.         hbox.set_border_width (6)
  114.         image = gtk.Image ()
  115.         image.set_from_stock (gtk.STOCK_DIALOG_QUESTION, gtk.ICON_SIZE_DIALOG)
  116.         image.set_alignment (0.0, 0.0)
  117.         hbox.pack_start (image, False, False, 0)
  118.         vboxouter = gtk.VBox (False, 6)
  119.         primary = gtk.Label ()
  120.         primary.set_markup ('<span weight="bold" size="larger">' +
  121.                             primarylabel + '</span>')
  122.         primary.set_line_wrap (True)
  123.         primary.set_alignment (0.0, 0.0)
  124.         vboxouter.pack_start (primary, False, False, 0)
  125.         vboxradio = gtk.VBox (False, 0)
  126.         systemwide = gtk.RadioButton (label=systemwidelabel)
  127.         vboxradio.pack_start (systemwide, False, False, 0)
  128.         clearpersonal = gtk.CheckButton (clearpersonallabel)
  129.         alignment = gtk.Alignment (0, 0, 0, 0)
  130.         alignment.set_padding (0, 0, 12, 0)
  131.         alignment.add (clearpersonal)
  132.         vboxradio.pack_start (alignment)
  133.         vboxouter.pack_start (vboxradio, False, False, 0)
  134.         personal = gtk.RadioButton (group=systemwide,
  135.                                     label=personallabel)
  136.         vboxouter.pack_start (personal, False, False, 0)
  137.         hbox.pack_start (vboxouter, False, False, 0)
  138.         dialog.vbox.pack_start (hbox, False, False, 0)
  139.         systemwide.set_active (True)
  140.         clearpersonal.set_active (True)
  141.         self.userdef = UserDefaultPrinter ()
  142.         clearpersonal.set_sensitive (self.userdef.get () != None)
  143.  
  144.         self.systemwide = systemwide
  145.         self.clearpersonal = clearpersonal
  146.         self.personal = personal
  147.         systemwide.connect ("toggled", self.on_toggled)
  148.         dialog.connect ("response", self.on_response)
  149.         dialog.show_all ()
  150.  
  151.     def on_toggled (self, button):
  152.         self.clearpersonal.set_sensitive (self.userdef.get () != None and
  153.                                           self.systemwide.get_active ())
  154.  
  155.     def on_response (self, dialog, response_id):
  156.         if response_id != gtk.RESPONSE_OK:
  157.             dialog.destroy ()
  158.             return
  159.  
  160.         if self.systemwide.get_active ():
  161.             if self.clearpersonal.get_active ():
  162.                 self.userdef.clear ()
  163.             self.set_default_fn (self.name)
  164.         else:
  165.             try:
  166.                 self.userdef.set (self.name)
  167.             except Exception, e:
  168.                 print "Error setting default: %s" % repr (e)
  169.  
  170.             self.refresh_fn ()
  171.  
  172.         dialog.destroy ()
  173.